#!/usr/bin/env python3
"""
数据库初始化脚本
用于创建所有数据库表结构
"""

import asyncio
import sys
import os
from pathlib import Path

# 添加项目根目录到Python路径，确保可以正确导入项目模块
project_root = Path(__file__).parent
sys.path.insert(0, str(project_root))

# 导入数据库引擎和基础类，用于创建表结构
from app.core.database import engine, Base
# 导入所有需要创建表的模型类
from app.models.user import User
from app.models.conversation import Conversation
from app.models.message import Message
# 导入日志记录器
from app.core.logger import get_logger

# 获取专门用于数据库初始化的日志记录器
logger = get_logger(service="db_init")

async def init_db():
    """初始化数据库，创建所有表"""
    print("正在初始化数据库...")
    
    try:
        # 使用异步上下文管理器创建数据库连接
        async with engine.begin() as conn:
            # 同步方式调用Base.metadata.create_all()方法创建所有表
            # 这会根据所有已导入的模型类在数据库中创建对应的表结构
            await conn.run_sync(Base.metadata.create_all)
        print("数据库初始化完成！")
    except Exception as e:
        print(f"数据库初始化失败: {e}")
        # 重新抛出异常以便上层捕获处理
        raise
    finally:
        # 确保在任何情况下都正确关闭数据库引擎，释放资源
        await engine.dispose()

def main():
    """主函数"""
    try:
        # 运行异步函数init_db()来执行数据库初始化
        asyncio.run(init_db())
        print("数据库初始化脚本执行成功")
    except Exception as e:
        print(f"数据库初始化失败: {e}")
        # 遇到异常时退出程序，返回错误码1
        sys.exit(1)

# 当脚本作为主程序运行时执行main()函数
if __name__ == "__main__":
    main()